package SingletonPattern;

//单例模式测试类
public class SingleTest {
    public static void main(String[] args) {
        //测试 1.饿汉式(静态常量)实现单例模式
        EagerSingleton1 eagerSingleton11 = EagerSingleton1.getInstance();
        EagerSingleton1 eagerSingleton12 = EagerSingleton1.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(eagerSingleton11 == eagerSingleton12);

        //测试 2.饿汉式(静态代码块)实现单例模式
        EagerSingleton2 eagerSingleton21 = EagerSingleton2.getInstance();
        EagerSingleton2 eagerSingleton22 = EagerSingleton2.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(eagerSingleton21 == eagerSingleton22);

        //测试 3.懒汉式(线程不安全)单例模式 (1)
        LazySingleton1 lazySingleton11 = LazySingleton1.getInstance();
        LazySingleton1 lazySingleton12 = LazySingleton1.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(lazySingleton11 == lazySingleton12);

        //测试 4.懒汉式(线程安全，同步方法)单例模式 (2)
        LazySingleton2 lazySingleton21 = LazySingleton2.getInstance();
        LazySingleton2 lazySingleton22 = LazySingleton2.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(lazySingleton21 == lazySingleton22);


        //测试5  5.懒汉式(线程不安全，同步代码块)单例模式 (3) 由于写法错误 无需测试

        //测试6  6.单例模式 双重检查锁
        DoubleCheckSingleton doubleCheckSingleton = DoubleCheckSingleton.getInstance();
        DoubleCheckSingleton doubleCheckSingleton2 = DoubleCheckSingleton.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(doubleCheckSingleton == doubleCheckSingleton2);

        //测试7   7.静态内部类单例模式
        StaticInnerClassSingleton staticInnerClassSingleton = StaticInnerClassSingleton.getInstance();
        StaticInnerClassSingleton staticInnerClassSingleton2 = StaticInnerClassSingleton.getInstance();
        //判断这两实例 是否为同一个
        System.out.println(staticInnerClassSingleton == staticInnerClassSingleton2);


        //测试8 8.枚举单例模式
        EnumSingleton enumSingleton = EnumSingleton.INSTANCE;
        EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE;
        //判断这两实例 是否为同一个
        System.out.println(enumSingleton == enumSingleton2);
        enumSingleton.methodDemo();//调用demo方法

    }
}
